home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / putz / catputz.m next >
Text File  |  1997-10-26  |  33KB  |  931 lines

  1. MODULE CatPutz;
  2.  
  3. (* Modul:               CatPutz                                 *)
  4. (* Autor:               Dirk Steins                             *)
  5. (* erstellt am:         5.4.91                                  *)
  6. (* letzte Žnderung am:  07.10.93                                *)
  7. (* Version:             2.25 ž                                  *)
  8. (* Interne Version:     V#295                                   *)
  9. (* Kommentar:           GEM-Version von CatPutz, alte Version   *)
  10. (*                      umbenannt zu CatPutz2                   *)
  11.  
  12.  
  13. (*==============================================================*)
  14. (* Datum    Version     Žnderung                                *)
  15. (*==============================================================*)
  16. (*                                                              *)
  17. (* 5.4.91   0.9         Modul erstellt aus altem CatPutz,       *)
  18. (*                      GEM-Oberfl„che eingebaut und            *)
  19. (*                      L”schen ber mehrere Gruppen.           *)
  20. (* 17.4.91  1.0         Version an Jo geschickt.                *)
  21. (* 26.4.91  1.1         Bug mit leeren Gruppen behoben          *)
  22. (* 28.4.                                                        *)
  23. (* 29.4.    1.1         Statistik-Ausgabe in Fenster,           *)
  24. (*                      Fensterverwaltung implementiert         *)
  25. (* 30.4.    1.1         Fensterverwaltung komplett, Zeichen-    *)
  26. (*                      satzauswahl drin, Ausgabe in Datei      *)
  27. (* 22.1.92  1.23        Bug in mtTerminal behoben, Zeichensatz  *)
  28. (*                      sollte jetzt immer richtig gesetzt sein.*)
  29. (* 14.2.92  1.24        Bug in ConvertDate behoben, der zu pein-*)
  30. (*                      lichen Datenverlusten gefhrt hat.      *)
  31. (*                      Relatives Datum auf Ende Januar ging    *)
  32. (*                      schief.                                 *)
  33. (* 16.4.92  1.25        Neue Window-Library eingebaut, un-      *)
  34. (*                      empfindlicher gegen Fehler in der       *)
  35. (*                      Parameterdatei gemacht.                 *)
  36. (* 17.4.92  1.25        Noch einen kleinen Bug im Schreiben     *)
  37. (*                      der neuen GRUPPEN.POS behoben.          *)
  38. (* 24.5.92  1.26        Versionsnummer ge„ndert und compiliert  *)
  39. (*                      fr neue CAT-Version mit ge„ndertem     *)
  40. (*                      GRUPPEN.POS                             *)
  41. (* 19.10.92 1.27        Anpassung an Datenbank von Cat 2.0      *)
  42. (*  1.11.92 1.28        Jetzt auch noch šberprfung auf Datum   *)
  43. (*                      eingebaut, Messages mit kaputtem Datum  *)
  44. (*                      werden jetzt auch totalgel”scht. Die    *)
  45. (*                      kaputten Nachrichten tauchen jetzt auch *)
  46. (*                      als totalgel”schte in der Statistik auf *)
  47. (* 12.92    1.29        L”schen von einzelnen Gruppen eingebaut.*)
  48. (* 29.12.92 1.30        CAT.INF kann nachgeladen werden, und    *)
  49. (*                      man kann die Liste auch auf das Clip-   *)
  50. (*                      board ausgeben (als .TXT und .CSV).     *)
  51. (* 21.01.93 1.31        Kein Absturz mehr, wenn kein GRUPPEN.POS*)
  52. (*                      vorhanden ist. Dann werden einfach keine*)
  53. (*                      neuen Positionen geschrieben.           *)
  54. (* 07.02.93 1.32        Nach dem Neuladen einer CAT.INF wurde   *)
  55. (*                      die Liste im Fenster nicht upgedatet.   *)
  56. (* 26.09.93 2.11        Anfang der Umstellung auf weitere       *)
  57. (*                      CAT-Module                              *)
  58. (* 30.09.93 2.15        CatPutz l„uft mit CATGROUP.*, l”scht    *)
  59. (*                      jetzt richtig, L”schanzeige im Fenster  *)
  60. (*                      und parallel                            *)
  61. (*  2.10.93 2.15        CatPutz prft, ob CAT oder CatPutz      *)
  62. (*                      schon aktiv sind und verweigert dann    *)
  63. (*                      den Start                               *)
  64. (*  4.10.93 2.16        Einbau der Kommandozeilensteuerung      *)
  65. (*  7.10.93 2.16        Beim L”schen ber die Kommandozeile     *)
  66. (*                      wurden auch Nachrichten mit dem         *)
  67. (*                      Interessant-Flag gl”scht. Das sollte    *)
  68. (*                      nicht der Fall sein, deshalb wurde das  *)
  69. (*                      ge„ndert. Allerdings kann es dadurch    *)
  70. (*                      passieren, daž beim L”schen mit Mengen- *)
  71. (*                      angabe die Zielmenge berschritten wird *)
  72. (* 14.10.93 2.17        Auswertung der Fehlercodes nach Fread/  *)
  73. (*                      Fwrite war falsch                       *)
  74. (* 21.10.93 2.17        Gruppennamen sind wieder Case-Insensitiv*)
  75. (*                      in der CFG-Datei.                       *) 
  76. (*                      Das Datum in der Konfigurationsbox ist  *) 
  77. (*                      nicht mehr ab und zu uninitialisiert.   *) 
  78. (* 29.10.93 2.18        Mauszeiger ist nur noch dann ein Ball,  *)
  79. (*                      wenn ein eigenes Fenster das Topwindow  *)
  80. (*                      ist.                                    *)
  81. (* 4.11.93  2.20        Beim Speichern der Statistik war ein    *)
  82. (*                      Filename nicht initialisiert.           *)
  83. (* 9.11.93  2.21        wind_update (check&Set) wird nur noch   *)
  84. (*                      unter MTOS oder Mag!X benutzt.          *)
  85. (* 13.11.93 2.22        Kommandozeilenparameter -a fr alle     *)
  86. (*                      Gruppen eingebaut.                      *)
  87. (*                      Der Gruppenname sollte jetzt immer      *)
  88. (*                      richtig gezeichnet werden, auch wenn    *)
  89. (*                      beim Gruppenwechsel die Ausgabe         *)
  90. (*                      gesperrt war.                           *)
  91. (* 28.11.93 2.23        Bug in ConvertDate behoben              *)
  92. (*                      Bug in Statistikausgabe behoben         *)
  93. (*  4.12.93 2.24        Es wird jetzt immer getestet, ob der    *)
  94. (*                      eingestellte TMP-Pfad existiert. Wenn   *)
  95. (*                      das nicht der Fall ist, dann wird der   *)
  96. (*                      Databasepfad genommen.                  *)
  97. (*  7.12.93 2.24        Ein paar weitere Sicherheitsabfragen    *)
  98. (*                      beim Dateihandling eingebaut.           *)
  99. (* 22.12.93 2.25 ž      Das Fenster wird auch im Batchmodus     *)
  100. (*                      nach jeder Gruppe refresht.             *)
  101. (*  11.1.94 2.25 ž      CatPutz-Logo ge„ndert. REQ-File wird    *)
  102. (*                      am Ende geschlossen.                    *)
  103. (*  14.1.94 2.26 ž      Bei wenig freiem Speicher konnte es     *)
  104. (*                      passieren, das CATPUTZ Speicherbl”cke   *)
  105. (*                      zerst”rt hat und den Rechner abge-      *)
  106. (*                      schossen hat. Das trat dann auf, wenn   *)
  107. (*                      der zu schreibende Block mehr als       *)
  108. (*                      doppelt so grož war wie der Writebuffer *)
  109. (*                      Wenn das L”schdatum gr”žer als das      *)
  110. (*                      Tagesdatum ist, kommt ein Alert         *)
  111. (*  14.7.94 2.26        Version freigegeben                     *)
  112. (*  17.7.94 2.27        Endlosschleife bei L”schen mit -a ber  *)
  113. (*                      die Kommandozeile behoben               *)
  114. (*                                                              *)
  115. (*==============================================================*)
  116.  
  117. (* Konzept fr CatPutz 3.0: 
  118.  * 
  119.  * Gruppenliste st„ndig im Fenster, eine oder mehrere selektierbar,
  120.  * umschaltbare Anzeige zwischen Einstellung und Statistik. 
  121.  * Gel”scht wird in den im Fenster selektierten Gruppen, bzw.
  122.  * die selektierten Gruppen komplett. 
  123.  * Steuerung ber Dialog mit im Fenster. 
  124.  * Alle L”schaktionen k”nnen auch im Hintergrund laufen, es wird
  125.  * der wind_update (get) Modus benutzt, Dialog liegt im Fenster.
  126.  * Es wird Filelocking untersttzt, so daž kein anderes Programm in der 
  127.  * Zeit auf die bearbeitete Database zugreifen kann. 
  128.  * 
  129.  * Was ist dafr alles zu tun:
  130.  * neue Gruppenliste bestehend aus GroupSelect und Statistikinformationen
  131.  * Neue Fensterfunktionen dafr.
  132.  * Konfigurierbare Ausgabe
  133.  * Modul nur fr L”schen in einer Gruppe
  134.  * Modul fr Fortschrittsanzeige
  135.  * 
  136.  *)
  137.  
  138.  
  139. FROM SYSTEM IMPORT ADDRESS, ADR, CADR, TSIZE, BYTE, ASSEMBLER, CALLSYS;
  140.  
  141. FROM MagicAES   IMPORT
  142.      AESIntIn, AESAddrIn, AESIntOut, 
  143.      MenuBar, MenuTnormal, MenuIenable,
  144.      EvntPmulti, MNSELECTED, APTERM, MUKEYBD, 
  145.      MUMESAG, MUBUTTON, MUM1,
  146.      KRSHIFT, KLSHIFT, KCTRL, KALT;
  147.      
  148. FROM MagicSys   IMPORT sBITSET, CastToInt, CastToBitset, Basepage;
  149.  
  150. IMPORT MagicStrings, MagicAES, MagicSys, MagicTypes;
  151.      
  152.         (* magic tools *)
  153. FROM mtAppl     IMPORT
  154.      ApplTerm, MouseArrow; 
  155.      
  156. IMPORT mtCommand, mtAppl, mtDials, mtAlerts, mtAESMenus;
  157.      
  158. (* mos *)
  159. IMPORT PrgCtrl;
  160.  
  161. FROM Storage            IMPORT ALLOCATE, DEALLOCATE, MemAvail;
  162.  
  163.  
  164. (* strings *)
  165. FROM StrConv            IMPORT  StrToCard;
  166.  
  167. IMPORT Strings, Lists;
  168. FROM Lists IMPORT LDir;
  169.  
  170. (* Disk I/O *)
  171.  
  172. FROM Directory          IMPORT  SetDefaultPath;
  173.  
  174.         (* eigene Module *)
  175. FROM PutzTypes          IMPORT grListEntry, ptrGrEntry, defaultOpts, delState,
  176.                                totalEntry, putzList, groupList, displayList,
  177.                                listEntryType, displayListEntry, ptrDispEntry;
  178.  
  179. FROM PutzRsc    IMPORT
  180.      PtrObjTree, menu, 
  181.      InitResource, doInfo, doOptBox, SaveParameter, LoadParameter,
  182.      ClrRsrc, doPathBox, GetTreeAddr, ReplaceStr, actBox;
  183.      
  184. IMPORT Catputz2;
  185.  
  186. FROM PutzWindows        IMPORT OpenWindow, GetWindowFont, SetWindowFont,
  187.                                SetNewList, IsPutzWindow, RedrawEntry;
  188.  
  189. FROM PutzList           IMPORT InitFormat;
  190.  
  191. IMPORT PutzDo, PutzGr;
  192. IMPORT PutzLog, PutzTypes, PutzAction, PutzGroup, PutzHelp;
  193.  
  194. (* CAT-Module: *)
  195.  
  196. FROM ConvertDate        IMPORT DateOk, StrToDate;
  197.  
  198. IMPORT WdwManager;
  199.  
  200. FROM SearchMenu          IMPORT MenuSearch;
  201.  
  202. IMPORT dataSys, Infofiles, ConvertDate;
  203. IMPORT ConfVars, MTPaths, CatGlobal, AssFuncs;
  204. FROM Void   IMPORT v;
  205.  
  206. FROM dataSys IMPORT posType;
  207.  
  208. IMPORT Mintbind;
  209.  
  210. (* Konzept fr CatPutz:
  211.  *
  212.  * L”schen in einer Gruppe geht wie folgt vor:
  213.  *
  214.  * Es wird ein Array angelegt von 0..65535, in dem pro Message der neue Index
  215.  * eingetragen wird. Als Feldindex dient dabei die Messagenummer.
  216.  * Das Feld wird zuerst mit 65535 fr alle Eintr„ge initialisiert.
  217.  * Bei einer Teill”schung wird der Messagetext durch den String
  218.  * <Message wurde gel”scht ersetzt>.
  219.  * Bei einer Totall”schung wird die Nachricht komplett entfernt.
  220.  * Die Kommentarverkettung wird am Ende (wegen der rechts-Verkettung)
  221.  * ber das Array wiederhergestellt.
  222.  * Das ganze funktioniert so, daž alle nachrichten, die nicht gel”scht werden,
  223.  * in ein neues *.DAT File kopiert werden. Bei einer Teill”schung wird der
  224.  * Messagetext ersetzt und die Messagel„nge angepažt.
  225.  *)
  226.  
  227. CONST  cWdwOpen    = 'StatWindowOpen';
  228.  
  229. VAR
  230.       wdwHandle       : INTEGER;
  231.       
  232. VAR msgBuf : ARRAY [0..15] OF INTEGER;
  233.     ende : BOOLEAN;
  234.     but  : CARDINAL;
  235.     event : sBITSET;
  236.  
  237.  
  238. (*----------------- Window Handling --------------------------*)
  239. TYPE mSet = SET OF [0..255];
  240.  
  241. VAR menuSet : mSet;
  242.  
  243. PROCEDURE EnableItem (tree : ADDRESS; item : INTEGER; enable : BOOLEAN);
  244. BEGIN
  245.   IF enable
  246.   THEN
  247.     IF ~(item IN menuSet) THEN 
  248.       MagicAES.MenuIenable (menu, item, 1); 
  249.       INCL(menuSet, item);
  250.     END;
  251.   ELSE
  252.     IF item IN menuSet THEN 
  253.       MagicAES.MenuIenable (menu, item, 0); 
  254.       EXCL(menuSet, item);
  255.     END;
  256.   END;
  257. END EnableItem;
  258.  
  259. PROCEDURE EnableMenuItems ();
  260.   VAR wdwOpen: BOOLEAN;
  261. BEGIN
  262.   ConfVars.GetConfDefBool (cWdwOpen, wdwOpen, FALSE);
  263.   IF wdwOpen
  264.   THEN
  265.     wdwOpen := IsPutzWindow (wdwHandle);
  266.   END;
  267.   IF ~wdwOpen
  268.   THEN
  269.     wdwHandle := -1;
  270.   END;
  271.   EnableItem (menu, Fmopen, ~wdwOpen);
  272.   EnableItem (menu, Fmclose, wdwOpen);
  273. END EnableMenuItems;
  274.  
  275. PROCEDURE openWind();
  276. BEGIN
  277.   OpenWindow (displayList, wdwHandle);
  278. END openWind;
  279.  
  280. (*-------------- Menu Handling -----------------------------*)
  281.  
  282. VAR quitProg : BOOLEAN;
  283.     groupDeleted: BOOLEAN;
  284.  
  285. PROCEDURE careForWindow();
  286.  VAR isOpen: BOOLEAN;
  287. BEGIN
  288.   ConfVars.GetConfDefBool (cWdwOpen, isOpen, FALSE);
  289.   IF isOpen
  290.   THEN
  291.     openWind(); 
  292.   END;
  293. END careForWindow;
  294.  
  295. PROCEDURE menuManager (item, menuIndex : CARDINAL; kstate : BITSET);
  296.   VAR grEntry : ptrGrEntry;
  297.       font,
  298.       fontSize: INTEGER;
  299.       wdwOpen : BOOLEAN;
  300.       vdi     : INTEGER;
  301. BEGIN
  302.   CASE item OF
  303.     Fmopen   : IF ~IsPutzWindow (wdwHandle) THEN openWind(); END |
  304.     Fmclose  : IF IsPutzWindow (wdwHandle) THEN v.bool := WdwManager.CloseWindow (wdwHandle, FALSE); END |
  305.     Fmsave   : SaveParameter (MTPaths.DataPath); |
  306.     Fmquit   : quitProg := TRUE; |
  307.     Aboutobj : doInfo(); |
  308.   ELSE
  309.   END;
  310.   MenuTnormal (menu, menuIndex, 1);
  311. END menuManager;
  312.  
  313. PROCEDURE msgHandler (pBuf : ADDRESS; kstate : BITSET): BOOLEAN;
  314.  VAR  pBuff: POINTER TO ARRAY [0..15] OF INTEGER;
  315. BEGIN
  316.   pBuff := pBuf;
  317.   CASE pBuff^[0] OF
  318.     MNSELECTED : menuManager (pBuff^[4], pBuff^[3], kstate); |
  319.     APTERM    : quitProg := TRUE; |
  320.   ELSE
  321.   END;
  322.   RETURN TRUE;
  323. END msgHandler;
  324.  
  325.   VAR mrect : RECORD
  326.                CASE :BOOLEAN OF
  327.                  TRUE : x,y,w,h : INTEGER|
  328.                  FALSE: adr, dum: ADDRESS
  329.                 END
  330.               END;
  331.  
  332. PROCEDURE setMultiParam();
  333. BEGIN
  334.   AESIntIn[0] := CastToInt (sBITSET{MUKEYBD, MUMESAG, MUBUTTON, MUM1});
  335.   AESIntIn[1]  := 259;
  336.   AESIntIn[2]  := INTEGER({1,0});
  337.   AESIntIn[3]  := INTEGER({});
  338.   AESIntIn[4]  := MagicAES.LeaveRect;
  339.   WITH mrect DO
  340.     AESIntIn[5]  := x;
  341.     AESIntIn[6]  := y;
  342.     AESIntIn[7]  := w;
  343.     AESIntIn[8]  := h;
  344.   END;
  345.   AESAddrIn[0] := ADR (msgBuf);
  346. END setMultiParam;
  347.  
  348. VAR scan : CHAR;
  349.     key  : CHAR;
  350.     kstate : sBITSET;
  351.     keyscan : INTEGER;
  352.     moX,
  353.     moY     : INTEGER;
  354.     moButton: BITSET;
  355.     moClicks: INTEGER;
  356.  
  357. PROCEDURE getMultiResult();
  358. BEGIN
  359.   moX := AESIntOut[1];
  360.   moY := AESIntOut[2];
  361.   moButton := MagicSys.CastToBitset(AESIntOut[3]);
  362.   kstate := CastToBitset(AESIntOut[4]);
  363.   keyscan := AESIntOut[5];
  364.   moClicks := AESIntOut[6];
  365.   (* Das auseinanderpflcken der einzeilnen Bytes geht in Assembler
  366.    * einfacher als in M2
  367.    *)
  368.   ASSEMBLER
  369.     MOVE.W      keyscan,D0      ; kreturn (ASCII und Scan)
  370.     MOVE.B      D0,key          ; Ascii nach key (Bits 0..7)
  371.     LSR.W       #8,D0           ; D0 rotieren
  372.     MOVE.B      D0,scan         ; Scancode holen (Bits 8..15)
  373.   END;
  374. END getMultiResult;
  375.  
  376. PROCEDURE CheckSingleCAT(): BOOLEAN;
  377.   CONST isDaAlt = '[3][CATPUTZ:|CAT oder CatPutz|ist schon gestartet, deshalb|kann CatPutz nicht laufen!][[Abbruch]';
  378.   VAR appName : PutzTypes.FileStr;
  379.       i       : INTEGER;
  380.       otherId : INTEGER;
  381. BEGIN
  382.   IF CatGlobal.multiTask
  383.   THEN
  384.     IF CatGlobal.multiTOS OR (CatGlobal.magIx & (CatGlobal.magIxVer >= $200))
  385.     THEN
  386.       (* CAT mittels ApplSearch suchen *)
  387.       FOR i := 0 TO 12 DO appName[i] := 0C; END;
  388.       IF MagicAES.ApplSearch (MagicAES.APFIRST, appName, v.int, otherId)
  389.       THEN
  390.         REPEAT 
  391.           Strings.DelTrailingBlanks (appName);
  392.           IF (otherId # mtAppl.ApplIdent) & 
  393.               (Strings.StrEqual(appName, 'CAT') OR
  394.                Strings.StrEqual(appName, 'CATPUTZ'))
  395.           THEN
  396.             v.int := mtAlerts.Alert (1, isDaAlt);
  397.             (* Tja, leider ein anderes CAT gefunden *)
  398.             RETURN FALSE
  399.           END;
  400.           FOR i := 0 TO 12 DO appName[i] := 0C; END;
  401.         UNTIL ~MagicAES.ApplSearch (MagicAES.APNEXT, appName, v.int, otherId);
  402.       END;
  403.     ELSIF CatGlobal.magIx
  404.     THEN
  405.       FOR i := 0 TO MagicAES.AESGlobal.apCount-1 DO
  406.         IF i # mtAppl.ApplIdent
  407.         THEN
  408.           appName[0] := '?';
  409.           appName[1] := 0C;
  410.           appName[3] := 0C;
  411.           appName[2] := CHR(i);
  412.           IF (MagicAES.ApplFind (ADR(appName)) # 0) 
  413.           THEN 
  414.             Strings.DelTrailingBlanks (appName);
  415.             IF Strings.StrEqual ('CAT', appName) OR
  416.                Strings.StrEqual ('CATPUTZ', appName)
  417.             THEN
  418.               v.int := mtAlerts.Alert (1, isDaAlt);
  419.               RETURN FALSE
  420.             END;
  421.           END;
  422.         END;
  423.       END;
  424.     END;
  425.   END;
  426.   RETURN TRUE;
  427. END CheckSingleCAT;
  428.  
  429. PROCEDURE performCmdDelete(group: ptrGrEntry; mode: PutzTypes.delMode;
  430.                            number: CARDINAL; date: LONGCARD): BOOLEAN;
  431.   VAR i : CARDINAL;
  432.       putzOpts  : PutzTypes.putzOptsRec;
  433.       res   : BOOLEAN;
  434. BEGIN
  435.   putzOpts := PutzDo.InitGroupFlags (group^.info^.catNumber, FALSE, res); 
  436.   IF ~res & (mode = PutzTypes.dFlags)
  437.   THEN
  438.     PutzLog.putTime();
  439.     PutzLog.WriteString ('L”schen nach Flags nicht m”glich, da Datumsfehler in');
  440.     PutzLog.WriteLn;
  441.     PutzLog.WriteString ('der Gruppenkonfiguration von ');
  442.     PutzLog.WriteString (group^.info^.name^);
  443.     PutzLog.WriteLn;
  444.     RETURN res
  445.   END;
  446.   putzOpts.dMode := mode;
  447.   CASE mode OF
  448.     PutzTypes.dNum        : PutzLog.putTime();
  449.                             PutzLog.WriteString ('L”sche nach Messages');
  450.                             PutzLog.WriteLn;
  451.                             PutzLog.putTime();
  452.                             PutzLog.WriteString ('vorgesehene Restmessages: ');
  453.                             PutzLog.WriteCard (number);
  454.                             PutzLog.WriteLn;
  455.                             putzOpts.number := number; |
  456.     PutzTypes.dDate       : PutzLog.putTime();
  457.                             PutzLog.WriteString ('L”sche nach Datum');
  458.                             PutzLog.WriteLn;
  459.                             PutzLog.putTime();
  460.                             PutzLog.WriteString ('L”schdatum: ');
  461.                             PutzLog.WriteCard (date);
  462.                             PutzLog.WriteLn;
  463.                             putzOpts.delDate := date; |
  464.     PutzTypes.dDateAndNum : PutzLog.putTime();
  465.                             PutzLog.WriteString ('L”sche nach Datum und Messages');
  466.                             PutzLog.WriteLn;
  467.                             PutzLog.putTime();
  468.                             PutzLog.WriteString ('vorgesehene Restmessages: ');
  469.                             PutzLog.WriteCard (number);
  470.                             PutzLog.WriteLn;
  471.                             PutzLog.putTime();
  472.                             PutzLog.WriteString ('L”schdatum: ');
  473.                             PutzLog.WriteCard (date);
  474.                             PutzLog.WriteLn;
  475.                             putzOpts.number := number; 
  476.                             putzOpts.delDate := date; |
  477.     PutzTypes.dFlags      : PutzLog.putTime();
  478.                             PutzLog.WriteString ('L”sche nach Flags');
  479.                             PutzLog.WriteLn; |
  480.   ELSE
  481.   END;
  482.   IF (mode = PutzTypes.dNum) & (number = 0)
  483.   THEN
  484.     PutzLog.WriteString ('L”sche Gruppe komplett: ');
  485.     PutzLog.WriteString (group^.info^.name^);
  486.     PutzLog.WriteLn;
  487.     res := PutzGroup.deleteGroup (group, TRUE);
  488.     IF res
  489.     THEN
  490.       groupDeleted := TRUE;
  491.       (* Displayliste neu aufbauen *)
  492.       IF IsPutzWindow (wdwHandle) THEN
  493.         PutzGr.ClearDisplayList(); 
  494.         PutzGr.BuildDisplayList(displayList);
  495.         PutzDo.CalcTotals;
  496.         SetNewList (wdwHandle, displayList);
  497.       END;
  498.     END;
  499.   ELSE
  500.     PutzAction.InitActionBox ();
  501.     res := PutzGroup.deleteInGroup (group, putzOpts, mode);
  502.     PutzAction.ReleaseActionBox();
  503.     IF IsPutzWindow (wdwHandle)
  504.     THEN
  505.       PutzDo.CalcTotals();
  506.       RedrawEntry (wdwHandle, group);
  507.       RedrawEntry (wdwHandle, ADR(totalEntry));
  508.     END;
  509.   END;
  510.   RETURN res
  511. END performCmdDelete;
  512.  
  513. PROCEDURE cmdError(logOpen: BOOLEAN; REF cmd, str: ARRAY OF CHAR);
  514.   VAR alt : ARRAY [0..255] OF CHAR;
  515. BEGIN
  516.   MagicStrings.Assign ('[3][CATPUTZ:|Fehler in Kommandozeile:|', alt);
  517.   MagicStrings.Append (cmd, alt);
  518.   MagicStrings.Append ('|', alt);
  519.   MagicStrings.Append (str, alt);
  520.   MagicStrings.Append ('][[Abbruch]', alt);
  521.   IF logOpen
  522.   THEN
  523.     PutzLog.WriteLn;
  524.     PutzLog.WriteString ("Fehler in Kommandozeile:");
  525.     PutzLog.WriteLn;
  526.     PutzLog.WriteString (cmd);
  527.     PutzLog.WriteString (' : ');
  528.     PutzLog.WriteString (str);
  529.     PutzLog.WriteLn;
  530.     PutzLog.WriteString ("L”schen ber Kommandozeile abgebrochen.");
  531.     PutzLog.WriteLn;
  532.     PutzLog.CloseLog();
  533.   END;
  534.   v.int := mtAlerts.Alert (1, alt);
  535. END cmdError;
  536.  
  537. (*$Z-*)
  538. PROCEDURE findName (entry: ADDRESS; info: ADDRESS): BOOLEAN;
  539.   VAR namePtr : POINTER TO ARRAY [0..255] OF CHAR;
  540.       gr      : ptrGrEntry;
  541. BEGIN
  542.   gr := entry;
  543.   namePtr := info;
  544.   RETURN AssFuncs.StrIequal (gr^.info^.name^, namePtr^);
  545. END findName;
  546. (*$Z=*)
  547.  
  548. PROCEDURE findGroup (name: ARRAY OF CHAR; VAR group: ptrGrEntry): BOOLEAN;
  549.   VAR p : CARDINAL;
  550.       found: BOOLEAN;
  551. BEGIN
  552.   LOOP
  553.     Lists.ResetList (putzList);
  554.     Lists.ScanEntries (putzList, Lists.forward, findName, ADR(name), found);
  555.     IF found
  556.     THEN
  557.       group := Lists.CurrentEntry (putzList);
  558.       RETURN group # NIL
  559.     ELSE
  560.       (* Suchen nach erstem _ und durch ' ' ersetzen *)
  561.       p := MagicStrings.Pos ('_', name, 0, FALSE);
  562.       IF p >= MagicStrings.Length (name)
  563.       THEN 
  564.         RETURN FALSE
  565.       END;
  566.       name[p] := ' ';
  567.     END;
  568.   END;
  569.   RETURN FALSE
  570. END findGroup;
  571.  
  572. PROCEDURE closeLog();
  573. BEGIN
  574.   (* Ok, das war's, weiter im normalen Programm *)
  575.   PutzDo.CalcTotals;
  576.   PutzLog.WriteLn;
  577.   PutzLog.WriteLn;
  578.   PutzLog.WriteString ("--------------------------------------------------");
  579.   PutzLog.WriteLn;
  580.   PutzLog.putTime ();
  581.   PutzLog.WriteString (" L”schen ber Kommandozeile beendet.");
  582.   PutzLog.WriteLn;
  583.   PutzLog.WriteLine  ("STATISTIK: ");
  584.   PutzLog.WriteString ("           Gesamtanzahl Messages vorher: ");
  585.   PutzLog.WriteCard (totalEntry.preMsgs);
  586.   PutzLog.WriteLn;
  587.   PutzLog.WriteString ("           Gesamtanzahl Messages nachher: ");
  588.   PutzLog.WriteCard (totalEntry.postMsgs);
  589.   PutzLog.WriteLn;
  590.   PutzLog.WriteString ("           Gesamtanzahl totalgel”schter Messages: ");
  591.   PutzLog.WriteCard (totalEntry.totalDel);
  592.   PutzLog.WriteLn;
  593.   PutzLog.WriteString ("           Gesamtanzahl teilgel”schter Messages: ");
  594.   PutzLog.WriteCard (totalEntry.partDel);
  595.   PutzLog.WriteLn;
  596.   PutzLog.WriteString ("           Gesamtanzahl besch„digter Messages: ");
  597.   PutzLog.WriteCard (totalEntry.badDel);
  598.   PutzLog.WriteLn;
  599.   PutzLog.WriteString ("           Gesamtanzahl Bytes vorher: ");
  600.   PutzLog.WriteCard (totalEntry.preBytes);
  601.   PutzLog.WriteLn;
  602.   PutzLog.WriteString ("           Gesamtanzahl Bytes nachher: ");
  603.   PutzLog.WriteCard (totalEntry.postBytes);
  604.   PutzLog.WriteLn;
  605.   PutzLog.WriteLn;
  606.   PutzLog.CloseLog();
  607. END closeLog;
  608.  
  609. PROCEDURE HandleCommandLine();
  610.   VAR cmd   : ARRAY [0..255] OF CHAR;
  611.       ctl   : CHAR;
  612.       params,
  613.       i     : INTEGER;
  614.       pos   : CARDINAL;
  615.       delDate   : LONGCARD;
  616.       delNumber : CARDINAL;
  617.       numberSet,
  618.       dateSet,
  619.       dModeSet  : BOOLEAN;
  620.       valid     : BOOLEAN;
  621.       dMode     : PutzTypes.delMode;
  622.       group     : ptrGrEntry;
  623.       logOpen   : BOOLEAN;
  624.       hlpPtr    : Lists.LCarrier;
  625. BEGIN
  626.   dateSet := FALSE;
  627.   numberSet := FALSE;
  628.   dModeSet := FALSE;
  629.   logOpen := FALSE;
  630.   params := mtCommand.ParamCount();
  631.   FOR i := 1 TO params DO
  632.     mtCommand.ParamString (i, cmd);
  633.     IF cmd[0] = '-' 
  634.     THEN
  635.       ctl := cmd[1];
  636.       MagicStrings.Delete (cmd, 0, 2);
  637.       CASE CAP(ctl) OF 
  638.         'D' : (* Datum in Kommandozeile *)
  639.               IF DateOk (cmd)
  640.               THEN
  641.                 delDate := StrToDate (cmd);
  642.                 IF delDate > ConvertDate.CurrentDate ()
  643.                 THEN
  644.                   (* Fehlermeldung! *)
  645.                   cmdError (logOpen, cmd, 'Datum gr”žer als Tagesdatum.');
  646.                   RETURN
  647.                 ELSE
  648.                   dateSet := TRUE;
  649.                   dModeSet := FALSE;
  650.                 END;
  651.               ELSE
  652.                 (* Fehlerhaftes Datum, Fehlermeldung! *)
  653.                 cmdError (logOpen, cmd, 'Fehlerhaftes Datum.');
  654.                 RETURN
  655.               END;
  656.       | 'G' : (* Gruppenname in Kommandozeile *)
  657.               IF findGroup (cmd, group)
  658.               THEN
  659.                 (* L”schmodus setzen *)
  660.                 IF ~dModeSet
  661.                 THEN
  662.                   IF dateSet
  663.                   THEN
  664.                     IF numberSet
  665.                     THEN
  666.                       dMode := PutzTypes.dDateAndNum
  667.                     ELSE
  668.                       dMode := PutzTypes.dDate
  669.                     END;
  670.                   ELSIF numberSet
  671.                   THEN
  672.                     dMode := PutzTypes.dNum
  673.                   ELSE
  674.                     dMode := PutzTypes.dFlags
  675.                   END;
  676.                   dModeSet := TRUE;
  677.                   dateSet := FALSE;
  678.                   numberSet := FALSE;
  679.                 END;
  680.                 IF ~logOpen 
  681.                 THEN
  682.                   IF PutzLog.OpenLog (MTPaths.DataPath) THEN END;
  683.                   PutzLog.putTime();
  684.                   PutzLog.WriteString (PutzTypes.version);
  685.                   PutzLog.WriteString (" fr CAT 3.x gestartet");
  686.                   PutzLog.WriteLn;
  687.                   logOpen := TRUE;
  688.                 END;
  689.                 IF ~performCmdDelete (group, dMode, delNumber, delDate)
  690.                 THEN
  691.                   (* Fehler beim L”schen! *)
  692.                   cmdError (logOpen, cmd, 'Fehler beim L”schen!');
  693.                   RETURN
  694.                 END;
  695.               ELSE
  696.                 (* Gruppe existiert nicht, Fehlermeldung *)
  697.                 cmdError (logOpen, cmd, 'Gruppe nicht vorhanden.');
  698.                 RETURN
  699.               END;
  700.       | 'A' : (* In allen Gruppen l”schen bis auf Pers”nliche *)
  701.               (* L”schmodus setzen *)
  702.               IF ~dModeSet
  703.               THEN
  704.                 IF dateSet
  705.                 THEN
  706.                   IF numberSet
  707.                   THEN
  708.                     dMode := PutzTypes.dDateAndNum
  709.                   ELSE
  710.                     dMode := PutzTypes.dDate
  711.                   END;
  712.                 ELSIF numberSet
  713.                 THEN
  714.                   dMode := PutzTypes.dNum
  715.                 ELSE
  716.                   dMode := PutzTypes.dFlags
  717.                 END;
  718.                 dModeSet := TRUE;
  719.                 dateSet := FALSE;
  720.                 numberSet := FALSE;
  721.               END;
  722.               (* Logfile ggf. ”ffnen *)
  723.               IF ~logOpen 
  724.               THEN
  725.                 IF PutzLog.OpenLog (MTPaths.DataPath) THEN END;
  726.                 PutzLog.putTime();
  727.                 PutzLog.WriteString (PutzTypes.version);
  728.                 PutzLog.WriteString (" fr CAT 2.5 gestartet");
  729.                 PutzLog.WriteLn;
  730.                 logOpen := TRUE;
  731.               END;
  732.               Lists.ResetList (putzList);
  733.               group := Lists.NextEntry (putzList);
  734.               WHILE group # NIL DO
  735.                 hlpPtr := putzList.current;
  736.                 IF (group^.info^.catNumber # dataSys.private)
  737.                 THEN
  738.                   IF ~performCmdDelete (group, dMode, delNumber, delDate)
  739.                   THEN
  740.                     (* Fehler beim L”schen! *)
  741.                     cmdError (logOpen, cmd, 'Fehler beim L”schen!');
  742.                     RETURN
  743.                   END;
  744.                 END;
  745.                 putzList.current := hlpPtr;
  746.                 group := Lists.NextEntry (putzList);
  747.               END;
  748.       | 'M' : (* Anzahl fr Messages in Kommandozeile *)
  749.               pos := 0;
  750.               delNumber := StrToCard (cmd, pos, valid);
  751.               IF valid
  752.               THEN
  753.                 numberSet := TRUE;
  754.                 dModeSet := FALSE;
  755.               ELSE
  756.                 (* Fehlermeldung *)
  757.                 cmdError (logOpen, cmd, 'Keine Nummer.');
  758.                 RETURN
  759.               END;
  760.       | 'Q' : IF logOpen THEN closeLog(); END; 
  761.               quitProg := TRUE; RETURN
  762.       ELSE
  763.         (* Fehlerhafte Kommandozeile *)
  764.         cmdError (logOpen, ctl, 'Unbekannte Option.');
  765.         RETURN 
  766.       END;
  767.     ELSE
  768.       IF i > 1
  769.       THEN
  770.         (* Fehlerhafte Kommandozeile! arg[1] kann Filename fr CAT.INF sein *)
  771.         cmdError (logOpen, cmd, 'Falsche Syntax.');
  772.         RETURN 
  773.       END;
  774.     END;
  775.   END;
  776.   IF logOpen
  777.   THEN
  778.     closeLog();
  779.   END;
  780. END HandleCommandLine;
  781.  
  782. VAR menuName    : ARRAY [0..40] OF CHAR;
  783.  
  784. CONST RscName = "catputz.rsc";
  785.  
  786. PROCEDURE InitCatputz(): BOOLEAN;
  787. (* Lesen von CAT.INF
  788.  * Jetzt wird die entsprechende CAT-Funktion benutzt,
  789.  * und auch die Variablen aus CAT.
  790.  * Zeile 11:    Database-Pfad
  791.  *)
  792.  VAR i  : CARDINAL;
  793.      infFileName,
  794.      rscName : PutzTypes.PathStr;
  795.      infName : PutzTypes.MaxStr;
  796.      success : BOOLEAN;
  797.      basePage    : MagicTypes.PtrPD;
  798.      env         : ADDRESS;
  799. BEGIN
  800.   rscName := RscName;
  801.   IF InitResource (rscName)
  802.   THEN
  803.     CatGlobal.busyMouse();
  804.     PutzAction.InitModule (actBox);
  805.     CatGlobal.SetAppl ('CATPUTZ');
  806.     CatGlobal.GetApplPath (CatGlobal.infPath);
  807.     (* Jetzt CAT.INF lesen *)
  808.     CatGlobal.infName := '';
  809.     CatGlobal.infPath := '';
  810.     IF ~MTPaths.ReadInf (CatGlobal.infPath, CatGlobal.infName, FALSE, TRUE)
  811.     THEN
  812.       RETURN FALSE
  813.     END;
  814.     (* Jetzt Gruppen initialisieren *)
  815.     SetDefaultPath (MTPaths.DataPath, v.int);
  816.     LoadParameter (MTPaths.DataPath);
  817.     
  818.     Infofiles.LoadInfoInf (TRUE, FALSE);
  819.     IF ~PutzGr.InitGroups() THEN MouseArrow(); RETURN FALSE END;
  820.     
  821.     (* suchen nach Environment-Variable TMP oder TEMP *)
  822.     basePage := Basepage();
  823.     env := basePage^.pEnv;
  824.     PutzGr.GetTempPath(env);
  825.  
  826.     mtAppl.MouseArrow();
  827.     RETURN TRUE
  828.   ELSE
  829.     RETURN FALSE
  830.   END;
  831. END InitCatputz;
  832.  
  833. PROCEDURE TestMint ();
  834. BEGIN
  835.   CatGlobal.isMintDomain := Mintbind.Pdomain (1) = 0;
  836. END TestMint;
  837.  
  838. CONST
  839.       helpScan     = 142C;
  840.   VAR wdwOpen: BOOLEAN;
  841.   
  842. BEGIN
  843.   TestMint();
  844.   WITH mrect DO
  845.     x := 0; y := 0; w := 1; h := 1;
  846.   END;
  847.   menuSet := mSet{0..255};
  848.   groupDeleted := FALSE;
  849.   MTPaths.DataPath := PutzTypes.whatText;        (* gegen optimierenden Linker *)
  850.   mtAlerts.ConfigAlert (mtAlerts.alticon);       (* mtAlerts konfigurieren *)
  851.   mtDials.DialConfig (mtDials.UseConfig, FALSE); (* mtDials konfigurieren *)
  852.   MouseArrow;
  853.  
  854.   IF ~CheckSingleCAT ()
  855.   THEN
  856.     ApplTerm(0);
  857.     PrgCtrl.TermProcess (0);
  858.   END;
  859.   IF ~InitCatputz () THEN RETURN END;
  860.   WdwManager.EnableIconify (TRUE);
  861.   MouseArrow;
  862.   IF CatGlobal.multiTOS OR (CatGlobal.magIx & (CatGlobal.magIxVer >= $300))
  863.   THEN
  864.     (* MultiTOS *)
  865.     MagicStrings.Assign ('  CatPutz ', menuName);
  866.     MagicStrings.Append (PutzTypes.xVersion, menuName);
  867.     v.int := MagicAES.MenuRegister (mtAppl.ApplIdent, menuName);
  868.     (* Und auch Bescheid sagen, daž wir AP_TERM verstehen *)
  869.     v.int := MagicAES.ShelWrite (MagicAES.InformAES, INTEGER(BITSET{MagicAES.ApTermBit}), 0, "", "");
  870.   END;
  871.   v.bool := mtAESMenus.InitMenuline (menu);
  872.   v.int := MenuBar (menu, 1);
  873.  
  874.   (* Menubar bei Windowmanager anmelden *)
  875.   WdwManager.InstallGlobalMenu (menu, msgHandler);
  876.  
  877.   InitFormat();
  878.  
  879.   careForWindow();
  880.   quitProg := FALSE;
  881.   HandleCommandLine();
  882.   LOOP
  883.     IF quitProg THEN EXIT END;
  884.     setMultiParam();
  885.     event := EvntPmulti ();
  886.     getMultiResult();
  887.     MagicAES.WindUpdate (MagicAES.BEGUPDATE);
  888.     IF WdwManager.HandleEvent (event, msgBuf, moButton, kstate, key, scan, keyscan, moX, moY, moClicks)
  889.     THEN END;
  890.     IF MUKEYBD IN event
  891.     THEN
  892.       IF ORD(scan) = 1 (* ESC *) THEN WdwManager.FullRedrawWdw (wdwHandle) END; 
  893.       IF MenuSearch (menu, mtAppl.ApplIdent, kstate, keyscan,
  894.                      menuManager, FALSE) 
  895.       THEN 
  896.       ELSIF (scan = helpScan)
  897.       THEN
  898.         (*
  899.         ConfVars.GetConfDefBool (cWdwOpen, wdwOpen, FALSE);
  900.         IF wdwOpen
  901.         THEN
  902.           wdwOpen := IsPutzWindow (wdwHandle);
  903.         END;
  904.         IF wdwOpen
  905.         THEN
  906.           PutzHelp.DoHelp (PutzHelp.window);
  907.         ELSE
  908.           PutzHelp.DoHelp (PutzHelp.general);
  909.         END;
  910.         *)
  911.         PutzHelp.DoHelp (PutzHelp.general);
  912.       END;
  913.     END;
  914.     WITH mrect DO
  915.       x := moX; y := moY;
  916.     END;
  917.     MagicAES.WindUpdate (MagicAES.ENDUPDATE);
  918.     EnableMenuItems();
  919.   END;
  920.   PutzGr.ClearDisplayList();
  921.   (* ClrRsrc(); *)
  922.   ConfVars.CloseConfig();
  923.   ApplTerm (0);
  924.   IF groupDeleted
  925.   THEN
  926.     PrgCtrl.TermProcess (04713H);
  927.   ELSE
  928.     PrgCtrl.TermProcess (0);
  929.   END;
  930. END CatPutz.
  931.